package com.ctb.dao;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import utiles.AppProperties;
import utiles.utilitarios;

import com.ctb.dto.DocumentoDteDTO;

//import com.dte.dto.GuiaDespRptaDTE;

public class DTEBoxDAO {
	private static Logger log = Logger.getLogger(DTEBoxDAO.class);
	private static String rutaPDFsii = (AppProperties.getProperty("aplicacion", "DTE_RUTA_PDF_SII"));
	private static String dteAmbiente = (AppProperties.getProperty("aplicacion", "DTE_AMBIENTE_DTBOX"));
	String horaActual = utilitarios.getFechaHoraActual(); //utilitarios.getHoraActual();
	/*
	public  List<GuiaDespRptaDTE> getPDFGuia(String idFolio){
		ArrayList<GuiaDespRptaDTE> listRetorno = new ArrayList<GuiaDespRptaDTE>();	
		DTEBoxDAO dteDAO = new DTEBoxDAO();
		long folio = Integer.parseInt(idFolio);
		boolean respuesta =  dteDAO.getPDFGuia(folio);
		GuiaDespRptaDTE rptaGuia = new GuiaDespRptaDTE();
		if (respuesta){		
			 System.out.println("peticion de la guia efectiva");		
			 rptaGuia.setGeneradaSN("S");
		}else{
			 System.out.println("aun no esta generara guia en SII para consultar");	
			 rptaGuia.setGeneradaSN("N");
		}
		listRetorno.add(rptaGuia);
		return listRetorno;		
	}
	*/

	public boolean getPDFGuia(long folio, int tipoDTE){
		String ambiente;
	 	if (dteAmbiente.equals("HOMOLOGACION"))
	 		ambiente = dteboxcliente.Ambiente.Homologacion;
	 	else if (dteAmbiente.equals("PRODUCCION"))
	 		ambiente = dteboxcliente.Ambiente.Produccion;
	 	else
	 		ambiente = "";


		String rutEmisor = "70335000-3";
		/*
		int tipoDTE=0;
		if (tipoDoc.equals("FCI")){
			tipoDTE  = dteboxcliente.TipoDocumento.TIPO_33;
		}else if (tipoDoc.equals("GDC")){
			tipoDTE  = dteboxcliente.TipoDocumento.TIPO_52;
		}
			
		*/
		//System.out.println("tipoDTE:"+tipoDTE);
		//long folio = 20;
		        
		String apiURL  = "http://10.10.10.10/api/Core.svc/Core";
		String apiAuth = "6dd62425-c356-41bb-948c-526a85d92b16";
		    
		dteboxcliente.Servicio servicio = new dteboxcliente.Servicio(apiURL, apiAuth);
		dteboxcliente.ResultadoRecuperarPDF resultado = servicio.ObtenerPDF(ambiente, rutEmisor, tipoDTE, folio);
		    
		// Procesar respuesta
		if (resultado.getResultadoServicio().getEstado() == 0) {
		    //Usar los datos que vienen en el resultado de la llamada
		    byte[] pdf = resultado.getDatos();	
		    String nFolio = String.valueOf(folio);
		    //System.out.println(horaActual+" Rescate Tipo:"+tipoDTE+" = "+nFolio);
		    grabaFilePdfbyte(pdf, nFolio, tipoDTE);		    
		} else {
		    
		    //Descripcion del error, actuar acorde
		    String error = resultado.getResultadoServicio().getDescripcion();
		    //log.error(horaActual+" Alerta DTEBoxDAO.getPDFGuia: " +error);
		    //System.out.println("Error DTEBoxDAO.getPDFGuia: "+ folio);
		    
		    return false;
		}
		
		return true;

		
	}
	
	public static void grabaFilePdfbyte(byte[] resByte, String nfolio, int tipoDTE){
		//FileInputStream fileInputStream=null;
		//String fileName = "C:\\paso\\GuiaDespacho"+ nfolio +".pdf";
		//String fileName = "C:\\tomcat\\webapps\\portalLiga2\\pdf\\GuiaDespacho"+ nfolio +".pdf";
		String fileName = "";
		if (tipoDTE  == 33){ //FCI			
			 fileName = rutaPDFsii+"Factura" + nfolio +".pdf";
		}else if (tipoDTE  == 52){ //GDC
			 fileName = rutaPDFsii+"GuiaDespacho" + nfolio +".pdf";			
		}else if (tipoDTE  == 34){ //GDC
			 fileName = rutaPDFsii+"FacturaExenta" + nfolio +".pdf";			
		}else if (tipoDTE  == 61){ //NCC
			 fileName = rutaPDFsii+"NotaDeCredito" + nfolio +".pdf";			
		}else if (tipoDTE  == 56){ //NDC
			fileName = rutaPDFsii+"NotaDeDebito" + nfolio +".pdf";			
		}else if (tipoDTE  == 39){ //BEI
			fileName = rutaPDFsii+"BoletaElectronica" + nfolio +".pdf";			
		}else{
			System.out.println("Error DTEBoxDAO.grabaFilePdfbyte Documento no codificado, revisar línea más arriba ("+tipoDTE+")");
			
		}

		
		//String fileName = rutaPDFsii+"GuiaDespacho" + nfolio +".pdf";
		BufferedOutputStream bs = null;
		FileOutputStream fs;
		try {
			fs = new FileOutputStream(new File(fileName));
			bs = new BufferedOutputStream(fs);
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println(" error 100 generacion del file folio "+nfolio);
		}
		
		try {
			bs.write(resByte);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("error 200 generacion del file folio "+nfolio);
		}
		 
		try {
			bs.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("error 300 generacion del file folio "+nfolio);
		}
		 bs = null;
	}


	public List<DocumentoDteDTO> testEstadoFiscalDole(long folio, int tipoDTE) {
	    // Llamada al servicio
		String ambiente;
	 	if (dteAmbiente.equals("HOMOLOGACION"))
	 		ambiente = dteboxcliente.Ambiente.Homologacion;
	 	else if (dteAmbiente.equals("PRODUCCION"))
	 		ambiente = dteboxcliente.Ambiente.Produccion;
	 	else
	 		ambiente = "";

	        
	        /*
	        String rutEmisor = "94612000-6";
	        int tipoDTE = dteboxcliente.TipoDocumento.TIPO_33;
	        long folio = 10372;

	        String apiURL = "http://25.85.167.103/api/Core.svc/Core";

	        String apiAuth = "a70445d7-ef68-4d9d-b917-69a9879ea5d3";
	        */
	        

			String rutEmisor = "70335000-3";
			/*
			int tipoDTE=0;
			if (tipoDoc.equals("FCI")){
				tipoDTE  = dteboxcliente.TipoDocumento.TIPO_33;
			}else if (tipoDoc.equals("GDC")){
				tipoDTE  = dteboxcliente.TipoDocumento.TIPO_52;
			}*/
			
			
			//int tipoDTE      = dteboxcliente.TipoDocumento.TIPO_52;
			//long folio = 20;
			        
			String apiURL  = "http://10.10.10.10/api/Core.svc/Core";
			String apiAuth = "6dd62425-c356-41bb-948c-526a85d92b16";;

	        
	        dteboxcliente.Servicio servicio = new dteboxcliente.Servicio(apiURL, apiAuth);
	        dteboxcliente.ResultadoEstadoFiscal resultado = servicio.EstadoFiscal(ambiente, rutEmisor, tipoDTE, folio);
	        //System.out.println("ambiente: " + ambiente+"rutEmisor"+rutEmisor+"tipoDTE"+tipoDTE+"folio"+folio);

	        // Resultado de la operación, 0 exitosa, diferente de cero error.
	        ArrayList<DocumentoDteDTO> resulList = new ArrayList<DocumentoDteDTO>();
            DocumentoDteDTO dte = new DocumentoDteDTO();

	        if (resultado.getResultadoServicio().getEstado() == 0) {
	            //Usar los datos que vienen en el resultado de la llamada

	            //Estado:
	            //0: si el documento fue autorizado
	            //1: si la resolución del SII está pendiente
	            //2: si la documento fue a  utorizado, pero con observaciones o reparos
	            //9: si el documento fue rechazado
	            String estado = resultado.getEstado();

	            //TrackId que entregó el SII con la autorización del documento.
	            String idSeguimiento = resultado.getIdSeguimiento();

	            //Comentarios asociados al estado de autorización.
	            String comentarios = resultado.getComentarios();
	            
	            //System.out.println(horaActual+" Estado: " + estado + " Id Seguimiento: " + idSeguimiento);
	            //System.out.println("\nComentarios: " + comentarios);
	            dte.setIdEstado(estado);
	            dte.setIdDocumento(idSeguimiento);
	            dte.setEstado(comentarios);
	            //Código de usuario a partir de aquí
	        } else {

	            //Descripción del error en caso de Result diferente de cero.
	            String error = resultado.getResultadoServicio().getDescripcion();
	            dte.setIdEstado("-1");
	            dte.setIdDocumento("error");
	            dte.setEstado(error);
	            //System.out.println(dte.getIdEstado()+" %%% "+dte.getEstado());
	            System.out.println(horaActual+" Error DTE: " + error);
	            System.out.println(resultado.getResultadoServicio().getExcepcionOriginal().toString());
	        }
	        resulList.add(dte);
	        return resulList;
	    }	
	
}
